<?php
namespace Framework\Validate;

/**
 * rules
 * messages
 * attributes 自定义属性
 */
class Validator
{
    use ValidatesAttributes;

    private $errors;

    private $data;

    private $rules;

    private $messages;

    private $customAttributes;


    public function __construct($translator, $data, $rules, $messages=[], $customAttributes=[])
    {
        $this->data     = $data;
        $this->rules    = $rules;
        $this->messages = $messages;
        $this->messages = $messages;

        $this->validate();
    }

    /**
     * 实例化一个验证器
     */
    public static function make(array $data, array $rules, array $messages=[], array $customAttributes=[])
    {
        return new static(null, $data, $rules, $messages, $customAttributes);
    }

    /**
     * 返回通过验证的数据
     */
    public function validated()
    {
        // code...
    }

    /**
     * 验证是否通过
     * @return bool
     */
    public function fails($value='')
    {

    }

    /**
     * 错误信息
     * $errors = $validator->errors();
     * $errors->all()               //检索所有字段的所有错误信息
     * $errors->first('email');     //检索特定字段的第一个错误信息
     * $errors->get('email')  []    //检索特定字段的所有错误信息
     * $errors->has('email')        //判断特定字段是否含有错误信息
     */
    public function errors()
    {
        // code...
    }

    /**
     * 执行验证
     */
    public function validate()
    {
        /**
         * 遍历每一个需要验证的规则，附加到 attribute
         */
        foreach ($this->rules as $attribute => $rules) {
            foreach ($rules as $rule) {
                $this->validateAttribute($attribute, $rule);
            }
        }
    }

    /**
     * 解析验证规则
     * 例 max:10
     */
    public function parseRule($rules)
    {
        if( is_array($rules) ){
            return [ucwords($rules), array_slice($rules, 1)];
        }

        $parameters = [];
        if (strpos($rules, ':') !== false) {
            [$rules, $parameter] = explode(':', $rules, 2);
            $parameters = str_getcsv($parameter);
        }

        return [ucwords(trim($rules)), $parameters];
    }

    /**
     * 对某个属性执行某个规则的验证
     * @param $attribute 要验证的某个字段
     * @param $rule 要验证的单个规则
     * @return void
     */
    public function validateAttribute($attribute, $rule)
    {
        [$rule, $parameters] = $this->parseRule($rule);

        $value = $this->getValue($attribute);

        //如果是文件 要判断文件是否上传成功


        $method = "validate{$rule}";

        //检查rule是否允许
        if( !method_exists($this, $method) ){
            exit("验证规则 $rule 不支持");
        }

        if( !$this->$method($attribute, $value, $parameters, $this) ) {
            //验证失败的项目写入错误消息 
            $this->addFailure($attribute, $rule, $parameters);
        }
    }

    /**
     * 取得要验证属性的值
     * @param $attribute 要读取的属性
     * @return void
     */
    public function getValue($attribute)
    {
        return isset($this->data[$attribute]) ? $this->data[$attribute] : null;
    }

    public function addFailure($attribute, $rule, $parameters)
    {
        $this->errors[$attribute][] = "{$rule} 未验证通过";



    }

    public function getErrors()
    {
        return $this->errors;
    }

    public function message()
    {

    }
}